package Repositorio;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import erro.ConexaoException;
import erro.RepositorioException;
import ClassesBasicas.Pais;
import Conexao.*;

/**
 * Camada de acesso aos dados de Pais no modelo DAO 
 * 	
 * @author Kledson
 *
 */

public class RepPais implements IRepPais {

	/* Representa o GConexao */
	private IConexao conexao;
	
	/**Quando o objeto RepPais for instanciado
	 * este construtor ir� instanciar o GConexao
	 * com uma Singleton da GConexao 
	 **/
	 
	public RepPais() {
		conexao = GConexao.getInstancia();
	}
	
	/**
	 *  Insere um Pais no Banco de Dados
	 *  
	 *  @throws ConexaoException, RepositorioException
	 *  @param Pais
	 *  
	 */
	 
	@Override
	public void salvar(Pais p) throws ConexaoException, RepositorioException {
		
		Connection c = conexao.conectar();
		
		String sqlSalvarPais = "INSERT INTO pais(nome_Pais) values(?)";
		try{
				PreparedStatement pstm = c.prepareStatement(sqlSalvarPais);
				pstm.setString(1,p.getNomePais());
				pstm.executeUpdate();
				pstm.close();
		}
		catch(SQLException e){
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}
	}
	
	/**
	 * Consulta um Pais pelo id e retorna um Pais
	 * 
	 * @throws ConexaoException,RepositorioException
	 * @return Pais
	 * 
	 */
	 
	@Override
	public Pais consultar(int cod) throws ConexaoException,RepositorioException {
		Pais a = null;
		
		Connection c = conexao.conectar();
		
		String sqlConsultPaisById = "SELECT cod_Pais,nome_Pais FROM Pais WHERE(cod_Pais = ?) ";
		
		try {
			PreparedStatement pstm = c.prepareStatement(sqlConsultPaisById);
			pstm.setInt(1,cod);
			ResultSet result = pstm.executeQuery();
			
			if(result.next()){
				a = new Pais();
				a.setCodPais(result.getInt("cod_Pais"));
				a.setNomePais(result.getString("nome_Pais"));
			}
			
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}
		
		return a;
	}
	
	/**
	 * Consulta um Pais pela descri��o
	 * 
	 * @throws ConexaoException,RepositorioException
	 * @return Pais
	 * 
	 */
	 
	@Override
	public Pais consultar(String descricao) throws ConexaoException,RepositorioException {
		Pais a = null;
		
		Connection c = conexao.conectar();
		
		String sqlConsultPaisById = "SELECT cod_Pais,nome_Pais FROM Pais WHERE(nome_Pais = ?) ";
		
		try {
			PreparedStatement pstm = c.prepareStatement(sqlConsultPaisById);
			pstm.setString(1,descricao);
			ResultSet result = pstm.executeQuery();
			
			if(result.next()){
				a = new Pais();
				a.setCodPais(result.getInt("cod_Pais"));
				a.setNomePais(result.getString("nome_Pais"));
			}
			
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}
		
		return a;
	}
	
	/**
	 * Exclui um Pais pelo codigo
	 * 
	 * @param int
	 * @return void
	 * @throws ConexaoException,RepositorioException
	 * 
	 */
	
	@Override
	public void excluir(int cod) throws ConexaoException,RepositorioException  {
		
		Connection c = conexao.conectar();
		
		String sqlExcluirPais = "DELETE FROM Pais WHERE(cod_Pais = ?)";
		
		try {
			PreparedStatement pstm = c.prepareStatement(sqlExcluirPais);
			pstm.setInt(1, cod);
			pstm.executeUpdate();
			pstm.close();
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}

	}
	
	/**
	 * Exclui um Pais pela descri��o
	 * 
	 * @param String
	 * @return void
	 * @throws ConexaoException,RepositorioException
	 * 
	 */
	
    @Override
	public void excluir(String descricao) throws ConexaoException,RepositorioException{
		
		Connection c = conexao.conectar();
		
		String sqlExcluirPais = "DELETE FROM Pais WHERE(nome_Pais = ?)";
		
		try {
			PreparedStatement pstm = c.prepareStatement(sqlExcluirPais);
			pstm.setString(1, descricao);
			pstm.executeUpdate();
			pstm.close();
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}
	}
	
	/**
	 * Lista todos os Paises
	 * 
	 * @return Collection<Pais>
	 * @throws ConexaoException,RepositorioException
	 * 
	 */
	
	@Override
	public Collection<Pais> listar() throws ConexaoException,RepositorioException {
		Pais p = null; 
		ArrayList<Pais> lista = new ArrayList<Pais>();
		
		Connection c = conexao.conectar();
		
		String sqlListaPais = "SELECT cod_Pais, nome_Pais FROM Pais";
		
		try {
			PreparedStatement pstm = c.prepareStatement(sqlListaPais);
			ResultSet result = pstm.executeQuery();
			
			while(result.next()){
				p = new Pais();
				p.setCodPais(result.getInt(1));
				p.setNomePais(result.getString(2));
				lista.add(p);
			}
		} catch (SQLException e) {
			throw new RepositorioException(e.getMessage());
		}
		finally{
			conexao.desconectar(c);
		}
		return lista;
	}

}